package gitee.blacol.myIdUtil.entity;

import com.alibaba.fastjson.JSON;
import lombok.Data;
import lombok.EqualsAndHashCode;

import java.io.*;
import java.nio.charset.StandardCharsets;

@EqualsAndHashCode(callSuper = true)
@Data
public class ComplexId extends IdThing{
    private String prefix;
    private String suffix;


    /**
     * 根据Builder的属性生成ID。<br>
     * <b>每调用一次该函数会导致序号加1</b>
     * @return 生成的ID
     * @throws IOException 如果设置了无效的持久化文件位置或者无法在指定的持久化文件位置创建文件时会抛出此错误。
     */
    public String generic() throws IOException {
        StringBuilder sb=new StringBuilder(prefix);
        sb.append(separator);
        sb.append(String.format(indexFormat,index++));
        sb.append(separator);
        sb.append(suffix);
        if (!filePath.equals("")){
            String jsonString = JSON.toJSONString(this);
            File f=new File(filePath);
            if (!f.exists()){
                f.createNewFile();
            }
            OutputStream os=new FileOutputStream(f);
            os.write(jsonString.getBytes(StandardCharsets.UTF_8));
            os.close();
        }
        return sb.toString();
    }

    /**
     * 从文件中恢复ID数据
     *
     * @return 回复完毕的数据
     * @throws IOException 如果设置了无效的持久化文件位置或者无法在指定的持久化文件位置创建文件时会抛出此错误。
     */
    public Boolean continueIndex() throws IOException {
        if (!filePath.equals("")){
            File f=new File(filePath);
            if (f.exists()){
                InputStream is=new FileInputStream(f);
                byte[] b=new byte[is.available()];
                is.read(b);
                String jsonString=new String(b,StandardCharsets.UTF_8);
                ComplexId complexId = JSON.toJavaObject(JSON.parseObject(jsonString), ComplexId.class);
                this.prefix=complexId.getPrefix();
                this.suffix=complexId.getSuffix();
                this.index=complexId.getIndex();
                this.filePath=complexId.getFilePath();
                this.indexFormat=complexId.getIndexFormat();
                this.separator=complexId.getSeparator();
                is.close();
                return true;
            }else{
                System.out.println("文件："+filePath+"不存在！");
                return false;
            }

        }else{
            System.out.println("没有设置文件路径，因此无法恢复");
            return false;
        }
    }
}
